#include <iostream>
#include <string>
using namespace std;

//函数调用运算符重载

//打印输出类
class MyPrint
{
public:

    //重载函数调用运算符
    void operator()(string test)
    {
        cout << test << endl;
    }
};

void myprint2(string test)
{
    cout << test << endl;
}

void test1()
{
    MyPrint myprint;

    myprint("hello world!");//调用
    //由于使用起来非常类似于函数调用，因此称为 仿函数

    myprint2("hello world!");
}


//加法类
class MyAdd
{
public:
    int operator()(int num1, int num2)
    {
        return num1 + num2;
    }
};

void test2()
{
    //仿函数非常灵活，没有固定的写法
    
    MyAdd myadd;
    //调用仿函数的方式：对象名(传入相应参数);
    int res = myadd(100, 99);
    cout << "res = " << res << endl;

    //也可以用匿名对象来调用：类名()(传入相应参数);
    //匿名对象的特点是执行完改行代码后立刻调用析构函数，释放对象空间，不再是执行完main方法后再调用对象的析构函数.
    cout << MyAdd()(1000, 999) << endl;
}


int main()
{
    test1();
    test2();
    return 0;
}